共计 1424 个字符,预计需要花费 4 分钟才能阅读完成。
一. 什么是 g 对象
- 在 flask 中,有一个专门用来存储用户信息的 g 对象,g 的全称的为 global
- g 对象在一次请求中的所有的代码的地方,都是可以使用的
ps : 我们完全可以将用户数据存到 request 对象中 :
request.name="shawn"
, 那为什么还要使用 g 对象?再想想, 如果我们保存一个这样的数据 :
request.method="xxx"
, 是不是就发现问题了, 为了避免这种重名的问题, flask 不推荐你使用 request 对象来保存数据, 而它所提供的 g 对象就是很好的选择
二.g 对象、flash、session 的区别
g
对象, 请求来一次 g 对象就改变了一次,或者重新赋值了一次, 比如在 login 路由中的 g 对象设置值,只能在 login 路由请求中获取,其它的请求都无法获取-
flash
一旦设置,可在任意一次请求中获取,但是只能取一次 -
session
对象是可以跨 request 的,只要 session 还未失效,不同的 request 的请求会获取到同一个 session
三.g 对象的使用
1.g 对象的使用
- 设值 :
g.[变量名] = 变量值
- 取值 :
g.[变量名]
2. 示例
- run.py
from flask import Flask, g, render_template, request
app = Flask(__name__)
app.debug = True
@app.route("/login/", methods=['GET', 'POST'])
def login():
if request.method == "GET":
return render_template('login.html')
else:
username = request.form.get("username")
password = request.form.get("password")
if username == "shawn" and password == "123":
g.username = username
g.password = password
login_info()
return " 登入成功!!"
else:
return " 用户名或密码错误!!"
@app.route('/index/')
def index():
try:
print(g.username)
print(g.password)
except Exception as e:
print(e) # 抛出异常:'_AppCtxGlobals' object has no attribute 'username'
return 'ok'
def login_info():
print(f" 当前登入用户名:{g.username}\n 当前登入密码:{g.password}")
"""
当前登入用户名:shawn
当前登入密码:123
"""
if __name__ == '__main__':
app.run()
- login.html
<body>
<form action="" method="post">
<input type="text" placeholder=" 用户名 " name="username">
<input type="password" placeholder=" 密码 " name="password">
<input type="submit" value=" 登入 ">
</form>
</body>
先访问 "/login/" 路由, 能从 g 对象取出 username、password
访问 "/index/" 路由, 显示 g 对象没有该属性
说明每次请求都是新的 g 对象
正文完